import isObject from "./isObject.js"

/**
 * 
 * @param {*} originValue  
 * @returns 
 */
function deepClone(originValue, map = new WeakMap()) {
  // 判断originValue是否是一个Map类型
  if (originValue instanceof Map) {
    return new Map([...originValue])
  }
  // 判断originValue是否是一个Set类型
  if (originValue instanceof Set) {
    return new Set([...originValue])
  }
  // 判断originValue是否是symbol类型
  if (typeof originValue === "symbol") {
    return Symbol(originValue.description)
  }
  // 判断originValue是否是函数类型
  if (typeof originValue === "function") {
    return originValue
  }
  // 判断originValue是否是对象类型
  if (!isObject(originValue)) {
    return originValue
  }
  if (map.has(originValue)) {
    return map.get(originValue)
  }
  // 判断originValue是数组还是对象
  const newObject = Array.isArray(originValue) ? [] : {}
  map.set(originValue, newObject)
  for (const key in originValue) {
    newObject[key] = deepClone(originValue[key], map)
  }
  // 对Symbol作为key进行处理
  const symbolkeys = Object.getOwnPropertySymbols(originValue)
  for (const sKey of symbolkeys) {
    newObject[sKey] = deepClone(originValue[sKey], map)
  }
  return newObject
}

export default deepClone